#include "key_it.h"
#include "gpio.h"

// 以GPIOB8按键为例
void hal_gpio_key_init()
{
	// 1. 设置GPIOB8引脚为GPIO功能 
    hal_gpio_init(GPIOB, GPIO_PIN_8, ALT0);
    hal_gpio_init(GPIOB, GPIO_PIN_16, ALT2);
	
	// 2. 设置GPIOB8引脚为输入模式 
    hal_gpio_mode(GPIOB, GPIO_PIN_8, IN_MODE);
    hal_gpio_mode(GPIOB, GPIO_PIN_16, IN_MODE);
	
	// 3. 设置GPIOB8的检测使能   GPIOBDETENB[8]
    GPIOB->DETENB |= 0x1 << 8;
    GPIOB->DETENB |= 0x1 << 16;
	
	// 4. 设置GPIOB8的事件检测模式  下降沿 
    GPIOB->DETMODE0 &= ~(0x3 << 16);
    GPIOB->DETMODE0 |= 0x2 << 16;
    GPIOB->DETMODEEX &= ~(0x1 << 8);

    GPIOB->DETMODE1 &= ~(0x3);
    GPIOB->DETMODE1 |= 0x2;
    GPIOB->DETMODEEX &= ~(0x1 << 16);
	
	// 5. 设置GPIOB8的中断使能
    GPIOB->INTENB |= 0x1 << 8;
    GPIOB->INTENB |= 0x1 << 16;

}
void hal_gicd_key_init()
{
	// 1. 设置GICD层中断使能寄存器  GICD_ISENABLER2[22]
    GICD_ISENABLER.ISENABLER2 |= 0x1 << 22;
	
	// 2. 设置中断的优先级寄存器    GICD_IPRIORITYR21[23:16] = 86
    GICD_IPRIORITYR.IPRIORITYR21 &= ~(0xFF << 16);
    GICD_IPRIORITYR.IPRIORITYR21 |= 86 << 16;
	
	// 3. 设置GICD层目标 分配寄存器,中断信号给CPU0处理 
	// 				GICD_ITARGETSR21[23:16] = 0x1
    GICD_ITARGETSR.ITARGETSR21 &= ~(0xFF << 16);
    GICD_ITARGETSR.ITARGETSR21 |= 0x1 << 16;
	
	// 4. 设置GICD层全局使能寄存器 GICD_CTRL[0]
    GICD_CTRL |= 0x1;
}
void hal_gicc_key_init()
{
	// 1. 设置GICC层中断屏蔽寄存器  GICC_PMR[7:0] = 255
    GICC_PMR &= ~(0xFF);
    GICC_PMR |= 255;
	// 2. 设置GICC层全局中断使能寄存器  GICC_CTRL[0]
    GICC_CTRL |= 0x1;
}

